package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import java.util.ArrayList;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanVaga;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.SuccessDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;


import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class ADetalhesVagaEmpresa extends DockPanel
{
	private VerticalPanel vPanel;
	private HorizontalPanel opcoesVagaPanel;

	private FlexTable detalhesGrid;
	
	private Button enviaExluirVagaBtn;
	private Button enviaEncerrarVagaBtn;
	private Button candidatosBtn;

	public ADetalhesVagaEmpresa(Integer idVaga, final DockPanel vListaVagas)
	{
		detalhesGrid = new FlexTable();
		detalhesGrid.setWidget(0, 0, new HTML("DETALHES DA VAGA"));
		detalhesGrid.getFlexCellFormatter().setAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
		detalhesGrid.setWidth("900px");
		detalhesGrid.setCellSpacing(0);
		detalhesGrid.setCellPadding(5);
		detalhesGrid.getFlexCellFormatter().setStyleName(0, 0, "detalhesVagaGridTitulo");

		vPanel = new VerticalPanel();
		vPanel.setWidth("850px");

		opcoesVagaPanel = new HorizontalPanel();
		opcoesVagaPanel.setSpacing(5);

		enviaExluirVagaBtn = new Button("Excluir Vaga");
		enviaEncerrarVagaBtn = new Button("Encerrar Vaga");
		candidatosBtn = new Button("Candidatos");

		opcoesVagaPanel.add(enviaExluirVagaBtn);
		if(vListaVagas instanceof AListaVagasEmAberto)
			opcoesVagaPanel.add(enviaEncerrarVagaBtn);
		opcoesVagaPanel.add(candidatosBtn);
		
		AsyncCallback<BeanVaga> cbDetalhesVaga = new AsyncCallback<BeanVaga>()
		{
			public void onSuccess(final BeanVaga vaga)
			{
				if (vaga.getDataCriacao() != null)
				{
					vPanel.add(new HTML("Abertura da vaga: " + vaga.getDataCriacao()));
				}

				if (vaga.getBEmpresaAssinante() != null)
				{
					if (vaga.getBEmpresaAssinante().getRazaoSocial() != null)
					{
						vPanel.add(new HTML("Empresa: " + vaga.getBEmpresaAssinante().getRazaoSocial()));
					}
					if (vaga.getBEmpresaAssinante().getResponsavel() != null)
					{
						vPanel.add(new HTML("Responsável pela Empresa: " + vaga.getBEmpresaAssinante().getResponsavel()));
					}
					if (vaga.getBEmpresaAssinante().getTelefone() != null)
					{
						vPanel.add(new HTML("Telefone da Empresa: " + vaga.getBEmpresaAssinante().getTelefone()));
					}
					if (vaga.getBEmpresaAssinante().getEmail() != null)
					{
						vPanel.add(new HTML("E-Mail da empresa: " + vaga.getBEmpresaAssinante().getEmail()));
					}
				}

				vPanel.add(new HTML("-------------------------------------------------------------------------"));

				if (vaga.getCargo() != null)
				{
					vPanel.add(new HTML("Cargo: " + vaga.getCargo()));	
				}

				if (vaga.getCargaHorariaSemanal() != null)
				{
					vPanel.add(new HTML("Horas semanais: " + vaga.getCargaHorariaSemanal()));					
				}
				
				if (vaga.getRemuneracao() != null)
				{
					vPanel.add(new HTML("Remuneração: " + vaga.getRemuneracao()));
				}

				if (vaga.getBTitularidade() != null)
				{
					vPanel.add(new HTML("Titularidade: " + vaga.getBTitularidade().getTitularidade()));
				}
				
				if (vaga.getAtribuicoes() != null)
				{
					vPanel.add(new HTML("Atribuições: " + vaga.getAtribuicoes()));
				}

				if (vaga.getBEstado() != null)
				{
					vPanel.add(new HTML("Localização da vaga (cidade/estado): " + vaga.getCidade() + "/" + vaga.getBEstado().getEstado()));
				}

				if (vaga.getExperiencia() != null)
				{
					vPanel.add(new HTML("Experiência: " + vaga.getExperiencia() + " ano(s)."));
				}

				if (vaga.getRequisitos() != null)
				{
					vPanel.add(new HTML("Requisitos: " + vaga.getRequisitos()));
				}

				detalhesGrid.setWidget(1, 0, vPanel);
				detalhesGrid.getFlexCellFormatter().setStyleName(1, 0, "detalhesVaga");

				// Encerrar vaga
				enviaEncerrarVagaBtn.addClickListener(
						new ClickListener()
						{
							public void onClick(Widget sender)
							{	
								AsyncCallback<Object> encerrarVaga = new AsyncCallback<Object>()
								{
									public void onSuccess(Object result)
									{
										SuccessDialogBox successDialobBox = new SuccessDialogBox("Vaga encerrada com sucesso.");
										successDialobBox.center();
										successDialobBox.show();
										ADetalhesVagaEmpresa.this.clear();
										vListaVagas.clear();
									}

									public void onFailure(Throwable caught)
									{
										ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao encerrar vaga: " + caught.getMessage());
										caught.printStackTrace();
										errorDialogBox.center();
										errorDialogBox.show();
									};
								};
								
								Util.getService().encerrarVaga(vaga, encerrarVaga);
							}
						}
				);
				
				// Excluir vaga
				enviaExluirVagaBtn.addClickListener(
						new ClickListener()
						{
							public void onClick(Widget sender)
							{
								AsyncCallback<Object> excluirVaga = new AsyncCallback<Object>()
								{
									public void onSuccess(Object result)
									{
										SuccessDialogBox successDialobBox = new SuccessDialogBox("Vaga excluida com sucesso.");
										successDialobBox.center();
										successDialobBox.show();
										ADetalhesVagaEmpresa.this.clear();
										vListaVagas.clear();
									}

									public void onFailure(Throwable caught)
									{
										ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao excluir vaga: " + caught.getMessage());
										caught.printStackTrace();
										errorDialogBox.center();
										errorDialogBox.show();
									};
								};
								
								Util.getService().excluirVaga(vaga.getId(), excluirVaga);
							}
						}
				);
				
				// Lista os candidatos
				candidatosBtn.addClickListener(
						new ClickListener()
						{
							public void onClick(Widget sender)
							{
								AsyncCallback<ArrayList<BeanProfissionalAssinante>> cbResultadoBusca = new AsyncCallback<ArrayList<BeanProfissionalAssinante>>()
								{
									public void onSuccess(ArrayList<BeanProfissionalAssinante> clProfissionais)
									{
										ADetalhesVagaEmpresa.this.clear();
										vListaVagas.add(new ABuscaProfissionaisResultado(clProfissionais), DockPanel.SOUTH);
									}

									public void onFailure(Throwable caught)
									{
										ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao buscar profissionais: " + caught.getMessage());
										errorDialogBox.center();
										errorDialogBox.show();
									};
								};
								
								Util.getService().getProfissionaisByVaga(vaga.getId(), cbResultadoBusca);
							}
						}
				);
			};
			
			public void onFailure(Throwable caught)
			{
				ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao buscar detalhes da vaga: " + caught.getMessage());
				errorDialogBox.center();
				errorDialogBox.show();
			};
		};

		this.add(detalhesGrid, DockPanel.CENTER);
		this.add(opcoesVagaPanel, DockPanel.SOUTH);

		Util.getService().getVagaById(idVaga, cbDetalhesVaga);
	}
}